package gui.empleado;

import interfaz.IEntidad;

import java.awt.Font;
import java.awt.Rectangle;
import java.awt.SystemColor;
import java.text.ParseException;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.text.MaskFormatter;

import manejador.ManejadorDeEmpleado;
import manejador.ManejadorDeRole;
import modelo.ModeloEmpleado;
import utils.Utilidad;
import entidad.Empleado;
import entidad.Role;

public class PanelModificarEmpleado extends JPanel {

	private static final long serialVersionUID = 1L;
	private JLabel lblNombre = null;
	private JLabel lblApellido = null;
	private JLabel lblSexo = null;
	private JTextField txtNombre = null;
	private JTextField txtApellido = null;
	private JRadioButton rbtnMasculino = null;
	private JRadioButton rbtnFemenino = null;
	private JLabel lblCedula = null;
	private JLabel lblDireccion = null;
	private JTextArea txtDireccion = null;
	private JTextField txtCedula = null;
	private JLabel lblTelefono = null;
	private JLabel lblCelular = null;
	private JLabel lblUsuario = null;
	private JLabel lblClave = null;
	private JLabel lblEstatus = null;
	private JRadioButton rbtnActivo = null;
	private JRadioButton rbtnInactivo = null;
	private JTextField txtTelefono = null;
	private JTextField txtCelular = null;
	private JTextField txtUsuario = null;
	private JPasswordField txtClave = null;
	private JButton btnAceptar = null;
	private JButton btnCancelar = null;
	private JPanel panelDatosEmpleado = null;
	private ButtonGroup grupoBotonesSexo = null; // @jve:decl-index=0:
	private ButtonGroup grupoBotonesEstatus = null;
	private Utilidad utilidad = null; // @jve:decl-index=0:
	private JLabel lblRole = null;
	private JComboBox cmbRole = null;
	private ManejadorDeRole manejadorRole = null;
	private ModeloEmpleado modeloEmpleado = null;
	private int idModificar = 0;
	private static PanelModificarEmpleado instancia = null;
	private JLabel lblEmail = null;
	private JTextField txtEmail = null;

	/**
	 * This is the default constructor
	 */
	public static PanelModificarEmpleado getInstancia() {
		if (instancia == null) {
			instancia = new PanelModificarEmpleado();
		}
		return instancia;
	}

	private PanelModificarEmpleado() {
		super();
		initialize();
		utilidad.formatearCampos(txtNombre, txtApellido, txtCedula, txtClave,
				txtCelular, txtDireccion, txtTelefono, txtUsuario);
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.modeloEmpleado = ModeloEmpleado.getInstancia();
		this.manejadorRole = ManejadorDeRole.getInstancia();
		this.utilidad = Utilidad.getInstancia();
		this.grupoBotonesEstatus = new ButtonGroup();
		this.grupoBotonesSexo = new ButtonGroup();
		lblEstatus = new JLabel();
		lblEstatus.setText("* Estatus:");
		lblEstatus.setBounds(new Rectangle(10, 452, 66, 25));
		lblClave = new JLabel();
		lblClave.setText("* Clave:");
		lblClave.setBounds(new Rectangle(10, 415, 66, 25));
		lblUsuario = new JLabel();
		lblUsuario.setText("* Usuario:");
		lblUsuario.setBounds(new Rectangle(10, 381, 66, 25));
		lblCelular = new JLabel();
		lblCelular.setText("Celular:");
		lblCelular.setBounds(new Rectangle(10, 344, 66, 25));
		lblTelefono = new JLabel();
		lblTelefono.setText("* Telefono:");
		lblTelefono.setBounds(new Rectangle(10, 311, 66, 25));
		lblDireccion = new JLabel();
		lblDireccion.setText("* Direccion:");
		lblDireccion.setBounds(new Rectangle(10, 172, 66, 23));
		lblCedula = new JLabel();
		lblCedula.setText("* Cedula:");
		lblCedula.setBounds(new Rectangle(10, 135, 66, 23));
		lblSexo = new JLabel();
		lblSexo.setText("* Sexo:");
		lblSexo.setBounds(new Rectangle(10, 95, 66, 23));
		lblApellido = new JLabel();
		lblApellido.setText("* Apellido:");
		lblApellido.setBounds(new Rectangle(10, 63, 66, 23));
		lblNombre = new JLabel();
		lblNombre.setText("* Nombre:");
		lblNombre.setBounds(new Rectangle(10, 28, 66, 23));
		this.setSize(418, 637);
		this.setLayout(null);
		this.add(getPanelDatosEmpleado(), null);
		this.add(getBtnCancelar(), null);
		this.add(getBtnAceptar(), null);
	}

	/**
	 * This method initializes txtNombre
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtNombre() {
		if (txtNombre == null) {
			txtNombre = new JTextField();
			txtNombre.setBounds(new Rectangle(90, 28, 161, 25));
		}
		return txtNombre;
	}

	/**
	 * This method initializes txtApellido
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtApellido() {
		if (txtApellido == null) {
			txtApellido = new JTextField();
			txtApellido.setBounds(new Rectangle(90, 63, 161, 25));
		}
		return txtApellido;
	}

	/**
	 * This method initializes rbtnMasculino
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnMasculino() {
		if (rbtnMasculino == null) {
			rbtnMasculino = new JRadioButton();
			rbtnMasculino.setText("Masculino");
			grupoBotonesSexo.add(rbtnMasculino);
			rbtnMasculino.setBounds(new Rectangle(90, 99, 85, 24));
		}
		return rbtnMasculino;
	}

	/**
	 * This method initializes rbtnFemenino
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnFemenino() {
		if (rbtnFemenino == null) {
			rbtnFemenino = new JRadioButton();
			rbtnFemenino.setText("Femenino");
			grupoBotonesSexo.add(rbtnFemenino);
			rbtnFemenino.setBounds(new Rectangle(178, 99, 85, 24));
		}
		return rbtnFemenino;
	}

	/**
	 * This method initializes txtDireccion
	 * 
	 * @return javax.swing.JTextArea
	 */
	private JTextArea getTxtDireccion() {
		if (txtDireccion == null) {
			txtDireccion = new JTextArea();
			txtDireccion.setBounds(new Rectangle(90, 172, 280, 123));
		}
		return txtDireccion;
	}

	/**
	 * This method initializes txtCedula
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtCedula() {
		if (txtCedula == null) {

			MaskFormatter mascara;
			try {
				mascara = new MaskFormatter("###-#######-#");
				txtCedula = new JFormattedTextField(mascara);
				txtCedula.setBounds(new Rectangle(90, 135, 161, 25));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return txtCedula;
	}

	/**
	 * This method initializes rbtnActivo
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnActivo() {
		if (rbtnActivo == null) {
			rbtnActivo = new JRadioButton();
			rbtnActivo.setText("Activo");
			grupoBotonesEstatus.add(rbtnActivo);
			rbtnActivo.setBounds(new Rectangle(91, 452, 65, 25));
		}
		return rbtnActivo;
	}

	/**
	 * This method initializes rbtnInactivo
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnInactivo() {
		if (rbtnInactivo == null) {
			rbtnInactivo = new JRadioButton();
			rbtnInactivo.setText("Inactivo");
			grupoBotonesEstatus.add(rbtnInactivo);
			rbtnInactivo.setBounds(new Rectangle(161, 452, 75, 25));
		}
		return rbtnInactivo;
	}

	/**
	 * This method initializes txtTelefono
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtTelefono() {
		if (txtTelefono == null) {
			MaskFormatter mascara;
			try {
				mascara = new MaskFormatter("###-###-####");
				txtTelefono = new JFormattedTextField(mascara);
				txtTelefono.setBounds(new Rectangle(90, 311, 161, 25));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return txtTelefono;
	}

	/**
	 * This method initializes txtCelular
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtCelular() {
		if (txtCelular == null) {
			MaskFormatter mascara;
			try {
				mascara = new MaskFormatter("###-###-####");
				txtCelular = new JFormattedTextField(mascara);
				txtCelular.setBounds(new Rectangle(90, 344, 161, 25));
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return txtCelular;
	}

	/**
	 * This method initializes txtUsuario
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtUsuario() {
		if (txtUsuario == null) {
			txtUsuario = new JTextField();
			txtUsuario.setBounds(new Rectangle(90, 381, 161, 25));
		}
		return txtUsuario;
	}

	/**
	 * This method initializes txtClave
	 * 
	 * @return javax.swing.JPasswordField
	 */
	private JPasswordField getTxtClave() {
		if (txtClave == null) {
			txtClave = new JPasswordField();
			txtClave.setBounds(new Rectangle(90, 415, 161, 25));
		}
		return txtClave;
	}

	/**
	 * This method initializes btnAceptar
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBtnAceptar() {
		if (btnAceptar == null) {
			btnAceptar = new JButton();
			btnAceptar.setText("Aceptar");
			btnAceptar.setIcon(new ImageIcon("./lib/images/add.png"));
			btnAceptar.setBounds(new Rectangle(85, 588, 100, 32));
			btnAceptar.addActionListener(new java.awt.event.ActionListener() {
				@SuppressWarnings("deprecation")
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if (utilidad.validar(txtNombre, txtApellido, txtCedula,
							txtDireccion, txtTelefono,  txtUsuario,
							txtClave, cmbRole) == false
							|| rbtnActivo.isSelected() == false
							&& rbtnInactivo.isSelected() == false
							|| rbtnMasculino.isSelected() == false
							&& rbtnFemenino.isSelected() == false) {

						JOptionPane.showMessageDialog(null,
								"Faltan Campos por llenar");
					} else {
						String estatus = rbtnActivo.isSelected() ? "Activo"
								: "Inactivo";
						String sexo = rbtnMasculino.isSelected() ? "Masculino"
								: "Femenino";
						int idRole = manejadorRole.getRoleID(cmbRole
								.getSelectedItem().toString());
						if(!txtEmail.getText().trim().equals("")&&txtCelular.getText().trim().equals("")){
							Empleado empleado = new Empleado(0,
									txtNombre.getText(), txtApellido.getText(),
									sexo, txtCedula.getText(), txtDireccion
											.getText(), txtTelefono.getText(), 
											idRole, txtUsuario
											.getText(), txtClave.getText(), estatus,txtEmail.getText());
							empleado = (Empleado)utilidad.convertirAMayuscula(empleado);
							int opcion = JOptionPane.showConfirmDialog(null,
									"Esta Seguro que desea Modificar este Empleado",
									"Confirmando",
									JOptionPane.YES_NO_OPTION);
					if (opcion == JOptionPane.YES_OPTION) {
						modeloEmpleado.modificar(empleado, idModificar);

						JOptionPane
								.showMessageDialog(null,
										"Empleado Modificado Con Exito",
										"Atencion",
										JOptionPane.INFORMATION_MESSAGE);
					}
							
							utilidad.limpiar(txtNombre, txtApellido, txtCedula,
									txtDireccion, txtTelefono, txtCelular,
									txtUsuario, txtClave, grupoBotonesEstatus,
									grupoBotonesSexo, cmbRole,txtEmail);
							

						}else if(txtEmail.getText().trim().equals("")&&!txtCelular.getText().trim().equals("")){
							Empleado empleado = new Empleado(0,
									txtNombre.getText(), txtApellido.getText(),
									sexo, txtCedula.getText(), txtDireccion
											.getText(), txtTelefono.getText(),txtCelular.getText(), 
											idRole, txtUsuario
											.getText(), txtClave.getText(), estatus);
							empleado = (Empleado)utilidad.convertirAMayuscula(empleado);
							int opcion = JOptionPane.showConfirmDialog(null,
									"Esta Seguro que desea Modificar este Empleado",
									"Confirmando",
									JOptionPane.YES_NO_OPTION);
					if (opcion == JOptionPane.YES_OPTION) {
						modeloEmpleado.modificar(empleado, idModificar);

						JOptionPane
								.showMessageDialog(null,
										"Empleado Modificado Con Exito",
										"Atencion",
										JOptionPane.INFORMATION_MESSAGE);
					}
							utilidad.limpiar(txtNombre, txtApellido, txtCedula,
									txtDireccion, txtTelefono, txtCelular,
									txtUsuario, txtClave, grupoBotonesEstatus,
									grupoBotonesSexo, cmbRole,txtEmail);
							
						}else if(txtEmail.getText().trim().equals("")&&txtCelular.getText().trim().equals("")){
							Empleado empleado = new Empleado(0,
									txtNombre.getText(), txtApellido.getText(),
									sexo, txtCedula.getText(), txtDireccion
											.getText(), txtTelefono.getText(), 
											idRole, txtUsuario
											.getText(), txtClave.getText(), estatus);
							empleado = (Empleado)utilidad.convertirAMayuscula(empleado);
							int opcion = JOptionPane.showConfirmDialog(null,
									"Esta Seguro que desea Modificar este Empleado",
									"Confirmando",
									JOptionPane.YES_NO_OPTION);
					if (opcion == JOptionPane.YES_OPTION) {
						modeloEmpleado.modificar(empleado, idModificar);

						JOptionPane
								.showMessageDialog(null,
										"Empleado Modificado Con Exito",
										"Atencion",
										JOptionPane.INFORMATION_MESSAGE);
					}
							utilidad.limpiar(txtNombre, txtApellido, txtCedula,
									txtDireccion, txtTelefono, txtCelular,
									txtUsuario, txtClave, grupoBotonesEstatus,
									grupoBotonesSexo, cmbRole,txtEmail);
							
						}else{
						Empleado empleado = new Empleado(0,
								txtNombre.getText(), txtApellido.getText(),
								sexo, txtCedula.getText(), txtDireccion
										.getText(), txtTelefono.getText(),
								txtCelular.getText(), idRole, txtUsuario
										.getText(), txtClave.getText(), estatus,txtEmail.getText());
						empleado = (Empleado)utilidad.convertirAMayuscula(empleado);
						int opcion = JOptionPane.showConfirmDialog(null,
								"Esta Seguro que desea Modificar este Empleado",
								"Confirmando",
								JOptionPane.YES_NO_OPTION);
				if (opcion == JOptionPane.YES_OPTION) {
					modeloEmpleado.modificar(empleado, idModificar);

					JOptionPane
							.showMessageDialog(null,
									"Empleado Modificado Con Exito",
									"Atencion",
									JOptionPane.INFORMATION_MESSAGE);
				}
						utilidad.limpiar(txtNombre, txtApellido, txtCedula,
								txtDireccion, txtTelefono, txtCelular,
								txtUsuario, txtClave, grupoBotonesEstatus,
								grupoBotonesSexo, cmbRole,txtEmail);

						
						}
						DialogoModificarEmpleado.getInstancia().setVisible(
								false);
					}

				}
			});
		}
		return btnAceptar;
	}

	/**
	 * This method initializes btnCancelar
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBtnCancelar() {
		if (btnCancelar == null) {
			btnCancelar = new JButton();
			btnCancelar.setText("Salir");
			btnCancelar.setIcon(new ImageIcon("./lib/images/salir.png"));
			btnCancelar.setBounds(new Rectangle(197, 588, 100, 32));
			btnCancelar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if (JOptionPane.showConfirmDialog(null,
							"Confirma que desea salir?", "Atencion",
							JOptionPane.OK_CANCEL_OPTION) == 0) {
					DialogoModificarEmpleado dialogoModificarEmpleado = DialogoModificarEmpleado
							.getInstancia();
					dialogoModificarEmpleado.setVisible(false);
					}
				}
			});
		}
		return btnCancelar;
	}

	/**
	 * This method initializes panelDatosEmpleado
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getPanelDatosEmpleado() {
		if (panelDatosEmpleado == null) {
			lblEmail = new JLabel();
			lblEmail.setBounds(new Rectangle(11, 521, 89, 20));
			lblEmail.setText("Email:");
			lblRole = new JLabel();
			lblRole.setBounds(new Rectangle(10, 485, 94, 25));
			lblRole.setText("* Role Empleado");
			panelDatosEmpleado = new JPanel();
			panelDatosEmpleado.setLayout(null);
			panelDatosEmpleado.setBounds(new Rectangle(11, 14, 395, 564));
			panelDatosEmpleado.setBorder(BorderFactory.createTitledBorder(
					BorderFactory.createLineBorder(
							SystemColor.activeCaptionText, 1),
					"Datos del Empleado", TitledBorder.DEFAULT_JUSTIFICATION,
					TitledBorder.DEFAULT_POSITION, new Font("Dialog",
							Font.BOLD, 14), SystemColor.activeCaptionText));
			panelDatosEmpleado.add(getRbtnInactivo(), null);
			panelDatosEmpleado.add(getRbtnActivo(), null);
			panelDatosEmpleado.add(lblEstatus, null);
			panelDatosEmpleado.add(lblClave, null);
			panelDatosEmpleado.add(getTxtClave(), null);
			panelDatosEmpleado.add(getTxtUsuario(), null);
			panelDatosEmpleado.add(getTxtCelular(), null);
			panelDatosEmpleado.add(getTxtTelefono(), null);
			panelDatosEmpleado.add(lblTelefono, null);
			panelDatosEmpleado.add(lblCelular, null);
			panelDatosEmpleado.add(lblUsuario, null);
			panelDatosEmpleado.add(getTxtDireccion(), null);
			panelDatosEmpleado.add(lblDireccion, null);
			panelDatosEmpleado.add(getTxtCedula(), null);
			panelDatosEmpleado.add(lblCedula, null);
			panelDatosEmpleado.add(getRbtnMasculino(), null);
			panelDatosEmpleado.add(getRbtnFemenino(), null);
			panelDatosEmpleado.add(getTxtApellido(), null);
			panelDatosEmpleado.add(getTxtNombre(), null);
			panelDatosEmpleado.add(lblNombre, null);
			panelDatosEmpleado.add(lblApellido, null);
			panelDatosEmpleado.add(lblSexo, null);
			panelDatosEmpleado.add(lblRole, null);
			panelDatosEmpleado.add(getCmbRole(), null);
			panelDatosEmpleado.add(lblEmail, null);
			panelDatosEmpleado.add(getTxtEmail(), null);
		}
		return panelDatosEmpleado;
	}

	/**
	 * This method initializes cmbRole
	 * 
	 * @return javax.swing.JComboBox
	 */
	private JComboBox getCmbRole() {
		if (cmbRole == null) {

			List<IEntidad> roles = manejadorRole.getEntidad();
			String[] rolesCombo = new String[roles.size() + 1];

			rolesCombo[0] = "Elija un Role";
			int indice = 1;
			for (IEntidad role : roles) {
				rolesCombo[indice++] = ((Role) role).getNombre();

			}
			cmbRole = new JComboBox(rolesCombo);
			cmbRole.setBounds(new Rectangle(108, 485, 134, 25));
		}
		return cmbRole;
	}

	/**
	 * This method initializes txtCedula
	 * 
	 * @return javax.swing.JTextField
	 */

	public int getIdModificar() {
		return idModificar;
	}

	public void setIdModificar(int idModificar) {
		this.idModificar = idModificar;
	}

	public void llenarCampos() {
		Empleado empleado = (Empleado) ManejadorDeEmpleado.getInstancia()
				.getEntidadPorId(getIdModificar());
		Role role = (Role) manejadorRole.getEntidadPorId(empleado.getIdRole());
		txtNombre.setText(empleado.getNombre());
		txtApellido.setText(empleado.getApellido());
		txtCedula.setText(empleado.getCedula());
		txtDireccion.setText(empleado.getDireccion());
		txtTelefono.setText(empleado.getTelefono());
		txtCelular.setText(empleado.getCelular());
		txtUsuario.setText(empleado.getUsuario());
		txtClave.setText(empleado.getClave());
		txtEmail.setText(empleado.getEmail());
		cmbRole.setSelectedItem(role.getNombre());
		if (empleado.getEstatus().equals("Activo")) {
			rbtnActivo.setSelected(true);
		} else {
			rbtnInactivo.setSelected(true);
		}
		if (empleado.getSexo().equals("Masculino")) {
			rbtnMasculino.setSelected(true);
		} else {
			rbtnFemenino.setSelected(true);
		}
	}

	/**
	 * This method initializes txtEmail	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtEmail() {
		if (txtEmail == null) {
			txtEmail = new JTextField();
			txtEmail.setBounds(new Rectangle(108, 519, 146, 25));
		}
		return txtEmail;
	}

} // @jve:decl-index=0:visual-constraint="10,10"
